package exerciciojsf.mbean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

import exerciciojsf.armazenamento.Cadastros;
import exerciciojsf.modelo.Anuncio;
import exerciciojsf.modelo.Comentario;

@ManagedBean(name = "gerenciadorAnuncios")
@RequestScoped
public class GerenciadorAnuncios {

	private Cadastros cadastros;

	private String msg = "";

	/**
	 * Uma referência ao ManagedBean que guarda o usuário logado no momento.
	 */
	@ManagedProperty(value = "#{gerenciadorLogin}")
	private GerenciadorLogin gerenciadorLogin;

	/**
	 * Uma referência ao parâmetro "anuncio" enviado na requisição (caso exista).
	 */
	@ManagedProperty(value = "#{param.anuncio}")
	private String idAnuncio;

	/**
	 * Uma referência ao parâmetro "idComentario" enviado na requisição (caso exista).
	 */
	@ManagedProperty(value = "#{param.idcomentario}")
	private String idComentario;

	private Anuncio anuncio = new Anuncio();
	private Comentario comentario = new Comentario();
	private Comentario resposta = new Comentario();

	public GerenciadorAnuncios() {
		cadastros = Cadastros.getInstance();
		anuncio = new Anuncio();
	}

	public Anuncio getAnuncio() {
		if (idAnuncio != null) {
			anuncio = cadastros.getAnuncios().get(Long.parseLong(idAnuncio));
		}
		return anuncio;
	}

	public void setAnuncio(Anuncio anuncio) {
		this.anuncio = anuncio;
	}

	/**
	 * Busca um anúncio baseado no parâmetro enviado "idAnuncio".
	 * @return
	 */
	public String visualizarAnuncio() {
		if (idAnuncio != null) {
			anuncio = cadastros.getAnuncios().get(Long.parseLong(idAnuncio));
		}
		return "anuncio";
	}

	/**
	 * Método que insere ou atualiza um anúncio, baseado no envio ou não do parâmetro
	 * "anuncio" na requisição. Caso não seja enviado, significa que é um novo anúncio. 
	 * Caso tenha sido enviado, as informações do mesmo são atualizadas.
	 * @return Página a ser exibida após o gerenciamento de um anúncio (página MeusAnuncios).
	 */
	public String atualizarAnuncio() {
		if (anuncio.getId() != null) {
			cadastros.atualizarAnuncio(gerenciadorLogin.getUsuario(), anuncio);
		} else {
			cadastros.cadastrarAnuncio(gerenciadorLogin.getUsuario(), anuncio);
		}
		anuncio = new Anuncio();
		return "meusAnuncios";
	}

	public GerenciadorLogin getGerenciadorLogin() {
		return gerenciadorLogin;
	}

	public void setGerenciadorLogin(GerenciadorLogin gerenciadorLogin) {
		this.gerenciadorLogin = gerenciadorLogin;
	}

	public String getIdAnuncio() {
		return idAnuncio;
	}

	public void setIdAnuncio(String idAnuncio) {
		this.idAnuncio = idAnuncio;
	}

	/**
	 * Método que executa a remoção de um anúncio baseado no parâmetro "idAnuncio" enviado
	 * na requisição.
	 * @return
	 */
	public String removerAnuncio() {
		if (idAnuncio != null) {
			cadastros.removerAnuncio(Long.parseLong(idAnuncio),
					gerenciadorLogin.getUsuario());
			msg = "Anúncio removido com sucesso!";
		}
		return "meusAnuncios";
	}

	/**
	 * Método que adiciona um comentário a um determinado anúncio.
	 * @return A página a ser retornada (página do anúncio comentado).
	 */
	public String enviarComentario() {
		if (anuncio.getId() != null) {
			anuncio = cadastros.buscarAnuncio(anuncio);
			anuncio.comentar(comentario);
		}
		comentario = gerenciadorLogin.isUsuarioLogado() ? new Comentario(
				gerenciadorLogin.getUsuario().getNome()) : new Comentario();
		return "anuncio";
	}

	/**
	 * Método que adiciona uma responsta a um determinado comentário.
	 * @return A página a ser retornada (página do anúncio que teve o comentário respondido).
	 */
	public String responderComentario() {
		if (comentario.getId() != null) {
			comentario = cadastros.buscarComentario(comentario.getId());
			comentario.responder(resposta);
			anuncio = cadastros.buscarAnuncioPorComentario(comentario);
		}
		return "anuncio";
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public String getIdComentario() {
		return idComentario;
	}

	public void setIdComentario(String idComentario) {
		this.idComentario = idComentario;
	}

	/**
	 * Método que retorna um comentário baseado no parâmetro "idComentario" enviado
	 * na requisição.
	 * @return O comentário desejado.
	 */
	public Comentario getComentario() {
		if (idComentario != null) {
			comentario = cadastros.buscarComentario(Long
					.parseLong(idComentario));
			resposta.setNome(gerenciadorLogin.getUsuario().getNome());
		} else {
			if (gerenciadorLogin.isUsuarioLogado()) {
				comentario.setNome(gerenciadorLogin.getUsuario().getNome());
			}
		}
		return comentario;
	}

	public void setComentario(Comentario comentario) {
		this.comentario = comentario;
	}

	public Comentario getResposta() {
		return resposta;
	}

	public void setResposta(Comentario resposta) {
		this.resposta = resposta;
	}
	
	/**
	 * Método que valida se um usuário pode responder um comentário
	 * (só poderá responder comentários de seus próprios anúncios).
	 * @return Verdadeiro caso o usuário seja o dono do anúncio atual,
	 * ou falso caso ele não seja o dono do anúncio.
	 */
	public boolean isPodeResponderComentarios(){
		return anuncio.getUsuario() != null ? anuncio.getUsuario().equals(gerenciadorLogin.getUsuario()) : false;
	}
}
